from typing import List, Dict
from factories.character_factory import CharacterFactory
from factories.llm_factory import LLMFactory
from factories.tts_factory import TTSFactory
from models.character import Character

class PodcastService:
    """播客服务主类"""
    
    def __init__(self, llm_config: Dict, tts_config: Dict):
        # 初始化工厂
        self.character_factory = CharacterFactory()
        self.llm = LLMFactory.create_llm(**llm_config)
        self.tts = TTSFactory.create_tts(**tts_config)
    
    def generate_single_character_podcast(self, topic: str, character: Character) -> bytes:
        """单一人设深度思考播客生成"""
        # 构建提示词
        prompt = f"""
        你是一个{character.personality}的{character.role}，请深度分析以下主题：
        主题：{topic}
        
        请以你的角色特点，提供深入的见解和分析。思考过程可以包括：
        1. 对主题的初步理解
        2. 分析主题的关键方面
        3. 提供具体例子或证据
        4. 总结观点
        
        请逐步思考并提供详细分析。
        """
        
        # 生成文本内容，使用更多参数控制生成质量
        content = self.llm.generate_text(
            prompt,
            max_tokens=1500,
            temperature=0.7,
            top_p=0.9,
            frequency_penalty=0.5
        )
        
        # 合成音频
        audio_data = self.tts.synthesize(content, character.name)
        
        return audio_data
    
    def generate_multi_character_podcast(self, topic: str, characters: List[Character]) -> list:
        """多人设多智能体播客生成"""
        # 构建多轮对话
        dialogues = []
        messages = [
            {
                "role": "system", 
                "content": f"主题：{topic}，请围绕此主题进行讨论，每个角色依次发言，要求：\n"
                          f"1. 发言要体现各自角色特点\n"
                          f"2. 回应其他角色的观点\n"
                          f"3. 保持讨论的连贯性和深度\n"
                          f"4. 逐步深入探讨主题"
            }
        ]
        
        # 模拟多角色对话 (简化版)
        for i, character in enumerate(characters):
            # 构建角色特定的提示
            if i == 0:
                # 第一个角色开场
                prompt = f"""
                你是{character.name}，一个{character.personality}的{character.role}。
                请围绕主题"{topic}"开始讨论，作为开场白简单介绍这个主题并提出一些初步观点。
                """
            else:
                # 其他角色回应
                previous_speaker = characters[i-1].name
                prompt = f"""
                你是{character.name}，一个{character.personality}的{character.role}。
                请回应{previous_speaker}刚才的观点，发表你的看法或补充相关见解。
                """
                
            messages.append({"role": "user", "content": prompt})
            
            # 获取AI生成的回复，使用更多参数控制生成质量
            response = self.llm.chat_completion(
                messages,
                max_tokens=800,
                temperature=0.8,
                top_p=0.9,
                frequency_penalty=0.3
            )
            
            messages.append({"role": "assistant", "content": response})
            
            # 添加到对话列表
            dialogues.append({
                "character": character,
                "content": response
            })
        
        # 为每个角色的发言合成音频
        audio_segments = []
        for dialogue in dialogues:
            character = dialogue["character"]
            content = dialogue["content"]
            
            # 合成音频
            audio_data = self.tts.synthesize(content, character.name)
            audio_segments.append({
                "character": character.name,
                "audio": audio_data
            })
        
        return audio_segments
    
    def clone_character_voice(self, audio_sample: str, character: Character) -> Character:
        """为角色克隆音色"""
        voice_id = self.tts.clone_voice(audio_sample)
        character.voice_id = voice_id
        return character